package scene.composants;

import java.awt.Color;
import java.awt.Composite;
import java.awt.FontMetrics;
import java.awt.Graphics2D;
import java.awt.Point;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.StringTokenizer;

import yaut.ENV;


import UML.Note;


/**
 * Composant Graphique representant une note (UML Diagramme des classes)
 * 
 * @author Delmas Gabriel
 */
public class RepresentationNote extends RepresentationComposant
{
	private static final long serialVersionUID = 8721778572141112565L;
	
	private static int MIN_HAUTEUR_ABSOLUE=50;
	private static int MIN_LARGEUR_ABSOLUE=50;

	private String texte;
	private List<String> lignesTexte = new ArrayList<String>();
	FontMetrics fontMetrics;
	protected boolean estEditer;
	private Note noteModel;
	
	public RepresentationNote(Point p)
	{
		super(p);
		texte="";
		estEditer=false;
	}
	public void ajouterModel(Note noteModel)
	{
		this.noteModel= noteModel;
	}
	public Note getModel(){return this.noteModel;}
	
	public void setEstEditer(boolean estEditer){this.estEditer=estEditer;}
	
	protected void CalculGraphique()
	{
		super.CalculGraphique();
	}
	
	
	public void dessiner(Graphics2D g2d)
	{		
		Color originalCouleur=g2d.getColor();
		Composite originalComposite = g2d.getComposite();
		
		fontMetrics = g2d.getFontMetrics();
		
		//Trace de l'ombre
		if(ombreComposant)
			dessinerOmbre(g2d);

		//Si le composant est en train d'etre deplacer on ajoute l'effet de transparence
		if(estTransfere)
			g2d.setComposite(makeComposite(0.5F));

		//Trace de l'arriere plan du composant
		g2d.setColor(couleurFond);
		g2d.fillRect(cadre.x,cadre.y,cadre.width,cadre.height);
		
		//Trace du contour du composant
		g2d.setColor(couleurBordure);
		g2d.drawRect(cadre.x,cadre.y,cadre.width,cadre.height);
		
		g2d.drawLine(cadre.x+cadre.width-15,cadre.y,cadre.x+cadre.width,cadre.y+15);
		g2d.setColor(Color.white);
		for(int i=0;i<15;i++)
		{
			g2d.drawLine(cadre.x+cadre.width-i,cadre.y,cadre.x+cadre.width,cadre.y+i);
		
		}
		g2d.setColor(Color.lightGray);
		for(int i=14;i>=0;i--)
		{
			g2d.drawLine(cadre.x+cadre.width+i-15,cadre.y+15,cadre.x+cadre.width-15,cadre.y-i+15);
		
		}
		g2d.setColor(Color.black);
		g2d.drawLine(cadre.x+cadre.width-15,cadre.y,cadre.x+cadre.width-15,cadre.y+15);
		g2d.drawLine(cadre.x+cadre.width,cadre.y+15,cadre.x+cadre.width-15,cadre.y+15);
		
		//On dessine le texte
		/*FontMetrics fontMetrics = g2d.getFontMetrics();
		int longueur = fontMetrics.stringWidth("MonTexte");
		int hauteur = fontMetrics.getHeight();*/
		
		g2d.setColor(couleurTexte);
		if(!estEditer)
		{
			int i=2;
			for (Iterator<String> it = this.lignesTexte.iterator(); it.hasNext();)
			{
				String ligne = it.next();
				g2d.drawString(ligne, getPosition().x+espace_texte, getPosition().y+espace_texte*i);
				i++;
			}
		}
		
		//Trace des extremites
		if(estSelectionne)
		{
			pext_hg.dessiner(g2d);
			pext_hd.dessiner(g2d);
			pext_bg.dessiner(g2d);
			pext_bd.dessiner(g2d);
		}
		
		//Valeurs original
		g2d.setColor(originalCouleur);
		g2d.setComposite(originalComposite);
		
	}
	public void dessinerOmbre(Graphics2D g2d)
	{
		Composite originalComposite = g2d.getComposite();
		//Initialisaton de la transparence
		g2d.setComposite(makeComposite(0.5F));
		//darkGray pour l'effet
		g2d.setColor(Color.darkGray);
		g2d.drawLine(cadre.x,cadre.y+cadre.height+1,cadre.x+cadre.width+2,cadre.y+cadre.height+1);
		g2d.drawLine(cadre.x+cadre.width+1,cadre.y+cadre.height,cadre.x+cadre.width+1,cadre.y+16);
		//gray pour accentuer l'effet
		g2d.setColor(Color.gray);
		g2d.drawLine(cadre.x,cadre.y+cadre.height+2,cadre.x+cadre.width+2,cadre.y+cadre.height+2);
		g2d.drawLine(cadre.x+cadre.width+2,cadre.y+cadre.height,cadre.x+cadre.width+2,cadre.y+17);
		
		g2d.setComposite(originalComposite);
	}

	
	public void setTexte(String texte){this.texte=texte;calculerDimension();}
	public String getTexte(){return this.texte;}
	
	public void calculerDimension()
	{
		lignesTexte.clear();
		if(!this.texte.equals(""))
		{
			StringTokenizer token = new StringTokenizer(texte, "\n\r"); 
			while(token.hasMoreTokens()) 
				this.lignesTexte.add(token.nextToken());
		
			int nbrLigne=0;
			
			if(this.lignesTexte.size()!=0)
			{
				this.largeur=fontMetrics.stringWidth(this.lignesTexte.get(0)+30);
				this.hauteur=fontMetrics.getHeight()*nbrLigne+20;
				for (Iterator<String> it = this.lignesTexte.iterator(); it.hasNext();)
				{
					int tailleLargeur=fontMetrics.stringWidth(it.next())+30;
					
					if(tailleLargeur>this.largeur)
					{
						this.largeur=tailleLargeur;
						this.minLargeur=tailleLargeur;
					}
					nbrLigne++;
				}
				int tailleHauteur=fontMetrics.getHeight()*nbrLigne+20;
				if(tailleHauteur>this.hauteur)
				{
					this.hauteur=tailleHauteur;
					this.minHauteur=tailleHauteur;
				}
				
				if(this.hauteur<MIN_HAUTEUR_ABSOLUE)
				{
					this.hauteur=MIN_HAUTEUR_ABSOLUE;
					this.minHauteur=MIN_HAUTEUR_ABSOLUE;
				}
				if(this.largeur<MIN_LARGEUR_ABSOLUE)
				{
					this.largeur=MIN_LARGEUR_ABSOLUE;
					this.minLargeur=MIN_LARGEUR_ABSOLUE;
				}
			}
			
		}
		CalculGraphique();
	}

	public void actionDoubleClique()
	{
		ENV.FRAME.getControleur().modifierNote(this);
	}
	public void actionMenuContextuel(Point p)
	{
		ENV.FRAME.getControleur().afficherMenuContextuel(this, p);
	}
	
	/*
	//Redefinition de IDessinableManipulable
	public void actionModifierCouleurFond()
	{
		this.controleur.notifierModifierCouleurFond();
	}
	public void actionModifierCouleurBordure()
	{
		this.controleur.notifierModifierCouleurBordure();
	}
	public void actionModifierCouleurTexte()
	{
		this.controleur.notifierModifierCouleurTexte();
	}
	
	
	
	public void actionDoubleClique()
	{
		actionModifier();
	}
	
	public void actionMenuContextuel(Point p)
	{
		this.controleur.notifierMenuContextuel(p);	
	}
	
	public void actionSupprimer()
	{
		this.controleur.notifierSuppression();
	}
	public void actionModifier()
	{
		this.controleur.notifierModifier();
	}
*/
}
